Use this R Notebook document to answer the questions and document
your work. Enter the R code used to answer each question in the
corresponding R code chunk. Write any textual explanations
outside of the chunks. Attempt to clean up your code as
much as possible so that only the necessary lines remain.
Part 1
- Read Hurlbert 1984 up to the section “Interspersion
of treatments” .
- Select a paper reporting the results of an experiment.
Choose a paper from your field reporting on an
experiment relevant to your own research.
A good choice might be a recent paper from your own lab (by your
PI or previous grad students or postdocs) or from your own
research.
If you cannot find a paper, come to the TAs or Professor Runcie
for suggestions.
Morgan, et al. htps://doi.org/10.1038/s41586-018-0828-1
- Choose a single experiment from this paper.
Many papers report the results of many individual experiments.
Choose only one of these.
Many papers report on many outcomes from the same experiment
(e.g. different response variables). Choose one
You should have access to the numeric results of the analysis of
the experiment (p-values, F-statistics, confidence intervals, effect
estimates), and ideally even the raw data. If results are presented in a
figure, you can try to extract these results using a digitization tools
like: https://plotdigitizer.com/. You don’t need to do this
yet, but may choose to for the final at the end of the quarter.
Briefly describe the experiment. Using the terminology of
Hurlbert 1984, address:
Is this a mensurative or manipulative experiment?
What was the experimental objective?
How were sources of confusion (Table 1)
controlled?
What were the results
Aim for 1-2 paragraphs. This doesn’t need to be long
This was a manipulative experiment. This experiment sought to
determine the potential biological function of excised stable linear
introns in S. cerevisiae by establishing a knockout line of 5 genes that
contribute a high amount to the content of excised stable linear introns
in saturated growth conditions and comparing their growth and abundance
to wild type S. cerevisiae in a competitive growth environment.
Experiments were performed in batches and biological replicates, which
addresses variability and random error. Control cultures of both the wt
and KO strains were grown in the same conditions to both provide a
baseline and control for any effects of the treatment itself, as well as
time passing. The experiment found that wt strains had a significant
advantage, showing a positive fold change in abundance during sustained
growth (n = 10, P = 9.4e-05, 95% confidence interval 0.12 to 0.25, two
tailed t-test), whereas the the KO had significant advantage during the
period that included re-entry to growth and exit from growth, with the
wt’s abundance showing a negative fold change in growth (n= 12, P=1e-06,
95% CI -0.74 to -0.46). This indicates that excised stable linear
introns can prove beneficial in some physiological contexts and
detrimental in others.
- Draw a diagram of the experiment.
Label the diagram using the terms we discussed in the first class
(Treatment, Experimental Unit, Blocks, Response)
Try to show the overall structure of how the experiment was laid
out.
The goal of this is to get you thinking about the issues in
experimental design, and to help me understand the range of questions
students are studying.
To upload your diagram, save it as a file (jpeg, png, etc, but not
pdf) in the directory of this .Rmd file. Then use the FIGURE/IMAGE
button in the toolbar to insert your image.
Here’s an example:

Note: You can use PowerPoint or a drawing tool to
create the diagram on your computer, or you can draw on paper, take a
picture with your phone, and then download that file into the folder
with this HW1.Rmd file, and change the file name above to the file name
of your picture. Using the Visual format (click the
Visual button on the top-left of this window), click on the
image icon to import and image.
Part 2 - R
practice
In lab, we ran simulations of an experiment to measure the average
length of fish in a pond.
Here, you will do a similar exercise except this time we will also
simulate an experimental manipulation, (i.e. a
treatment) and you will study the treatment’s
effect.
We’ll use the example of measuring pulses of people in class with a
treatment of sitting vs standing. But this time we’ll “measure” each
person’s pulse both sitting and standing.
For the purposes of this simulation, I’ll state that the TRUE values
for the relevant population parameters are the following:
The average pulse of someone sitting is 70bpm
The standard deviation of pulses among sitting people is
10bpm
The average effect of standing is 10bpm
The standard deviation of standing effects is 3bpm
Simulate 1
person
Here is the outline of code to simulate the measurements for one
person. Fill in the appropriate values by replacing the ___
with numbers.
ave_sitting = 70
sd_sitting = 10
ave_standing_effect = 10
sd_standing_effect = 3
sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
sitting_pulse
[1] 64.31331
standing_effect = rnorm(n=1,mean = ave_standing_effect, sd = sd_standing_effect)
standing_pulse = sitting_pulse + standing_effect
standing_pulse
[1] 73.90778
standing_effect
[1] 9.594464
Enter the sitting pulse, standing pulse, and standing effect. Include
units.]
Sitting Pulse: 68.78457 bpm
Standing Pulse: 77.82868 bpm
Standing Effect: 9.044107 bpm
As an experimenter, it is impossible to directly
observe the effect of standing for this person. All
you could observe is sitting_pulse and
standing_pulse. Show that you can calculate the standing
effect for this person from these two values (replace ___
with R code):
calculated_standing_effect = standing_pulse - sitting_pulse
calculated_standing_effect
[1] 9.594464
Do you get the same value as above?
Yes. But that’s just one person, so I would imagine I would.
Simulate an
experiment involving 40 people
Here is the outline of code to simulate the measurements of standing
effects for 40 people. It uses a for loop like in lab.
Fill in the calculation needed (replace ___ with code) and
run the code. Estimate the average standing effect.
# leave this code here so the simulation is repeatable
set.seed(1)
# start of your code:
n_people = 40
observed_standing_effects = rep(NA,times = n_people)
for(person in 1:n_people) {
sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
standing_effect = rnorm(n=1,mean = ave_standing_effect, sd = sd_standing_effect)
standing_pulse = sitting_pulse + standing_effect
calculated_standing_effect = standing_pulse - sitting_pulse #Okay, but I feel like I'm doing this wrong. Isn't this just standing_effect? At least on an individual level.
observed_standing_effects[person] = calculated_standing_effect
}
average_effect_estimate = mean(observed_standing_effects)
average_effect_estimate
[1] 10.07916
Enter your answer here. Include units
Average effect estimate is 10.07916 BPM
What is the TRUE
error in this estimate?
Use the vector observed_standing_effects above, to
calculate how much your estimate missed the true value.
true_error = mean(observed_standing_effects) - ave_standing_effect
true_error
[1] 0.07915764
Enter your answers here. Include units.
True error is 0.07915764 bpm
Calculate the TRUE
standard error based on this experimental design and the TRUE population
parameters above
# Enter your code here
true_se = sqrt((sd_standing_effect**2 + var(observed_standing_effects)) / n_people)
true_se
[1] 0.6596864
Enter your answers here. Include units.
True standard error = 0.6596864 bpm
Simulation 100
replicate experiments with the same size and parameters above, and
record the estimated standing effect from each experiment
The following code takes the single experiment with 40 people above,
and uses a second for loop to repeat it 100 times. Fill
in the code from your answers above to complete so that it estimates the
treatment effect for each person, and then calculates the average
observed treatment effect.
Calculate the mean and standard
deviation of the treatment effect estimates across the 100
experiments. Compare these values to the values that you expect.
set.seed(1)
n_experiments = 100
replicate_estimates = rep(NA,times = n_experiments)
for(expt in 1:100) {
# code for each individual experiment:
n_people = 40
observed_standing_effects = rep(NA,times = n_people)
for(person in 1:n_people) {
sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
standing_effect = rnorm(n=1,mean = ave_standing_effect, sd = sd_standing_effect)
standing_pulse = sitting_pulse + standing_effect
calculated_standing_effect = standing_pulse - sitting_pulse
observed_standing_effects[person] = calculated_standing_effect
}
# calculate the estimated mean treatment effect for this experiment
current_experiment_estimate = mean(observed_standing_effects)
# save that estimate in the vector of results
replicate_estimates[expt] = current_experiment_estimate
}
mean(replicate_estimates)
sd(replicate_estimates)
Enter your answers here. Include units.
Mean treatment effect is 10.03964 bpm Standard deviation is 0.451245
bpm
Compare to an
experiment that measured DIFFERENT PEOPLE for the two treatments
The following code modifies the experimental design to be more
similar to what we did in class. We select 40 people to observe sitting,
and 40 DIFFERENT people to observe standing. We calculate the average
pulses of the people sitting, and the average pulses of the people
standing. We then take the difference between these two as our estimate
of the standing effect. This full experiment is
replicated 100 times so that we can compare it’s efficiency to the
previous experiment.
Report the mean and standard
deviation of the treatment effect estimates across the 100
experiments. Compare these values to the previous experimental design
above
set.seed(1)
n_experiments = 100
replicate_estimates = rep(NA,times = n_experiments)
for(expt in 1:100) {
# code for each individual experiment:
# first observe 40 people sitting
n_people = 40
observed_sitting_pulses = rep(NA,times = n_people)
for(person in 1:n_people) {
sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
observed_sitting_pulses[person] = sitting_pulse
}
# Then observe 40 people standing
n_people = 40
observed_standing_pulses = rep(NA,times = n_people)
for(person in 1:n_people) {
sitting_pulse = rnorm(n=1,mean = ave_sitting, sd = sd_sitting)
standing_effect = rnorm(n=1,mean = ave_standing_effect, sd = sd_standing_effect)
standing_pulse = sitting_pulse + standing_effect
observed_standing_pulses[person] = standing_pulse
}
# Then calculate the two averages
average_sitting_pulse = mean(observed_sitting_pulses)
average_standing_pulse = mean(observed_standing_pulses)
# Then get our estimate of the standing effect
current_experiment_estimate = average_standing_pulse - average_sitting_pulse
# save that estimate in the vector of results
replicate_estimates[expt] = current_experiment_estimate
}
mean(replicate_estimates)
sd(replicate_estimates)
Enter your answers here. Include units.
Mean treatment effect is 10.20996 bpm Standard deviation of Treatment
Effect is 2.115401 bpm
Discuss experimental
design issues that might impact the VALIDITY of the two designs
Focus on issues that might affect the scientific interpretation of
the results.
The first one that comes to mind is in the heterogeneity in the
population, especially in the second case. Measuring the standing and
sitting pulses of two distinct populations leaves room for biological
differences between the two of the groups to influence the results.
Furthermore, there were no controls described in the experiment, which
for the first would be a replication where the treatment group didn’t
stand. This all comes together to make it difficult to definitively
quantify the effect of standing on a person’s pulse with any sense of
scope, since there exists no established baseline and the second
experiment is open to a great deal of error in population
differences.
LS0tCnRpdGxlOiAiSFcgMSIKb3V0cHV0OiAKIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KClVzZSB0aGlzIFIgTm90ZWJvb2sgZG9jdW1lbnQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbnMgYW5kIGRvY3VtZW50IHlvdXIgd29yay4KRW50ZXIgdGhlIFIgY29kZSB1c2VkIHRvIGFuc3dlciBlYWNoIHF1ZXN0aW9uIGluIHRoZSBjb3JyZXNwb25kaW5nIFIgY29kZSBjaHVuay4KV3JpdGUgYW55IHRleHR1YWwgZXhwbGFuYXRpb25zICoqb3V0c2lkZSoqIG9mIHRoZSBjaHVua3MuCkF0dGVtcHQgdG8gY2xlYW4gdXAgeW91ciBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gdGhhdCBvbmx5IHRoZSBuZWNlc3NhcnkgbGluZXMgcmVtYWluLgoKV2hlbiB5b3UgYXJlIGRvbmU6CgoxLiAgU2VsZWN0ICdSdW4gQWxsJyBmcm9tIHRoZSAnUnVuJyBkcm9wZG93biBtZW51LgoyLiAgU2F2ZSAoRmlsZSAtXD4gU2F2ZSkKMy4gIENsaWNrICdQcmV2aWV3JyB0byBicmluZyB1cCB0aGUgYEhXMS5uYi5odG1sYCBmaWxlLiBDaGVjayB0aHJvdWdoIHRoaXMgdG8gbWFrZSBzdXJlIGl0IHJlbmRlcmVkIGNvcnJlY3RseS4KNC4gIFVwbG9hZCB0aGUgZmlsZXM6IGBIVzEubmIuaHRtbGAgYW5kIGBIVzEuUm1kYCB0byBDYW52YXMuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgUGFydCAxCgoxLiAgUmVhZCAqKkh1cmxiZXJ0IDE5ODQqKiB1cCB0byB0aGUgc2VjdGlvbiAiSW50ZXJzcGVyc2lvbiBvZiB0cmVhdG1lbnRzIiAuCjIuICBTZWxlY3QgYSBwYXBlciByZXBvcnRpbmcgdGhlIHJlc3VsdHMgb2YgYW4gZXhwZXJpbWVudC4KCi0gICBDaG9vc2UgYSBwYXBlciBmcm9tICoqeW91ciBmaWVsZCoqIHJlcG9ydGluZyBvbiBhbiBleHBlcmltZW50IHJlbGV2YW50IHRvIHlvdXIgb3duIHJlc2VhcmNoLgoKLSAgIEEgZ29vZCBjaG9pY2UgbWlnaHQgYmUgYSByZWNlbnQgcGFwZXIgZnJvbSB5b3VyIG93biBsYWIgKGJ5IHlvdXIgUEkgb3IgcHJldmlvdXMgZ3JhZCBzdHVkZW50cyBvciBwb3N0ZG9jcykgb3IgZnJvbSB5b3VyIG93biByZXNlYXJjaC4KCi0gICBJZiB5b3UgY2Fubm90IGZpbmQgYSBwYXBlciwgY29tZSB0byB0aGUgVEFzIG9yIFByb2Zlc3NvciBSdW5jaWUgZm9yIHN1Z2dlc3Rpb25zLgoKICAgID4gTW9yZ2FuLCBldCBhbC4gaHRwczovL2RvaS5vcmcvMTAuMTAzOC9zNDE1ODYtMDE4LTA4MjgtMQoKMi4gIENob29zZSBhIHNpbmdsZSBleHBlcmltZW50IGZyb20gdGhpcyBwYXBlci4KCi0gICBNYW55IHBhcGVycyByZXBvcnQgdGhlIHJlc3VsdHMgb2YgbWFueSBpbmRpdmlkdWFsIGV4cGVyaW1lbnRzLgogICAgQ2hvb3NlIG9ubHkgb25lIG9mIHRoZXNlLgoKLSAgIE1hbnkgcGFwZXJzIHJlcG9ydCBvbiBtYW55IG91dGNvbWVzIGZyb20gdGhlIHNhbWUgZXhwZXJpbWVudCAoZS5nLiBkaWZmZXJlbnQgcmVzcG9uc2UgdmFyaWFibGVzKS4KICAgIENob29zZSBvbmUKCi0gICBZb3Ugc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBudW1lcmljIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzIG9mIHRoZSBleHBlcmltZW50IChwLXZhbHVlcywgRi1zdGF0aXN0aWNzLCBjb25maWRlbmNlIGludGVydmFscywgZWZmZWN0IGVzdGltYXRlcyksIGFuZCBpZGVhbGx5IGV2ZW4gdGhlIHJhdyBkYXRhLgogICAgSWYgcmVzdWx0cyBhcmUgcHJlc2VudGVkIGluIGEgZmlndXJlLCB5b3UgY2FuIHRyeSB0byBleHRyYWN0IHRoZXNlIHJlc3VsdHMgdXNpbmcgYSBkaWdpdGl6YXRpb24gdG9vbHMgbGlrZTogPGh0dHBzOi8vcGxvdGRpZ2l0aXplci5jb20vPi4KICAgIFlvdSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgeWV0LCBidXQgbWF5IGNob29zZSB0byBmb3IgdGhlIGZpbmFsIGF0IHRoZSBlbmQgb2YgdGhlIHF1YXJ0ZXIuCgotICAgQnJpZWZseSBkZXNjcmliZSB0aGUgZXhwZXJpbWVudC4KICAgIFVzaW5nIHRoZSB0ZXJtaW5vbG9neSBvZiAqKkh1cmxiZXJ0IDE5ODQqKiwgYWRkcmVzczoKCiAgICAtICAgSXMgdGhpcyBhIG1lbnN1cmF0aXZlIG9yIG1hbmlwdWxhdGl2ZSBleHBlcmltZW50PwoKICAgIC0gICBXaGF0IHdhcyB0aGUgZXhwZXJpbWVudGFsIG9iamVjdGl2ZT8KCiAgICAtICAgSG93IHdlcmUgKipzb3VyY2VzIG9mIGNvbmZ1c2lvbiAoVGFibGUgMSkqKiBjb250cm9sbGVkPwoKICAgIC0gICBXaGF0IHdlcmUgdGhlIHJlc3VsdHMKCiAgICAtICAgQWltIGZvciAxLTIgcGFyYWdyYXBocy4KICAgICAgICBUaGlzIGRvZXNuJ3QgbmVlZCB0byBiZSBsb25nCgogICAgPiBUaGlzIHdhcyBhIG1hbmlwdWxhdGl2ZSBleHBlcmltZW50LgogICAgPiBUaGlzIGV4cGVyaW1lbnQgc291Z2h0IHRvIGRldGVybWluZSB0aGUgcG90ZW50aWFsIGJpb2xvZ2ljYWwgZnVuY3Rpb24gb2YgZXhjaXNlZCBzdGFibGUgbGluZWFyIGludHJvbnMgaW4gUy4KICAgID4gY2VyZXZpc2lhZSBieSBlc3RhYmxpc2hpbmcgYSBrbm9ja291dCBsaW5lIG9mIDUgZ2VuZXMgdGhhdCBjb250cmlidXRlIGEgaGlnaCBhbW91bnQgdG8gdGhlIGNvbnRlbnQgb2YgZXhjaXNlZCBzdGFibGUgbGluZWFyIGludHJvbnMgaW4gc2F0dXJhdGVkIGdyb3d0aCBjb25kaXRpb25zIGFuZCBjb21wYXJpbmcgdGhlaXIgZ3Jvd3RoIGFuZCBhYnVuZGFuY2UgdG8gd2lsZCB0eXBlIFMuCiAgICA+IGNlcmV2aXNpYWUgaW4gYSBjb21wZXRpdGl2ZSBncm93dGggZW52aXJvbm1lbnQuCiAgICA+IEV4cGVyaW1lbnRzIHdlcmUgcGVyZm9ybWVkIGluIGJhdGNoZXMgYW5kIGJpb2xvZ2ljYWwgcmVwbGljYXRlcywgd2hpY2ggYWRkcmVzc2VzIHZhcmlhYmlsaXR5IGFuZCByYW5kb20gZXJyb3IuCiAgICA+IENvbnRyb2wgY3VsdHVyZXMgb2YgYm90aCB0aGUgd3QgYW5kIEtPIHN0cmFpbnMgd2VyZSBncm93biBpbiB0aGUgc2FtZSBjb25kaXRpb25zIHRvIGJvdGggcHJvdmlkZSBhIGJhc2VsaW5lIGFuZCBjb250cm9sIGZvciBhbnkgZWZmZWN0cyBvZiB0aGUgdHJlYXRtZW50IGl0c2VsZiwgYXMgd2VsbCBhcyB0aW1lIHBhc3NpbmcuCiAgICA+IFRoZSBleHBlcmltZW50IGZvdW5kIHRoYXQgd3Qgc3RyYWlucyBoYWQgYSBzaWduaWZpY2FudCBhZHZhbnRhZ2UsIHNob3dpbmcgYSBwb3NpdGl2ZSBmb2xkIGNoYW5nZSBpbiBhYnVuZGFuY2UgZHVyaW5nIHN1c3RhaW5lZCBncm93dGggKG4gPSAxMCwgUCA9IDkuNGUtMDUsIDk1JSBjb25maWRlbmNlIGludGVydmFsIDAuMTIgdG8gMC4yNSwgdHdvIHRhaWxlZCB0LXRlc3QpLCB3aGVyZWFzIHRoZSB0aGUgS08gaGFkIHNpZ25pZmljYW50IGFkdmFudGFnZSBkdXJpbmcgdGhlIHBlcmlvZCB0aGF0IGluY2x1ZGVkIHJlLWVudHJ5IHRvIGdyb3d0aCBhbmQgZXhpdCBmcm9tIGdyb3d0aCwgd2l0aCB0aGUgd3QncyBhYnVuZGFuY2Ugc2hvd2luZyBhIG5lZ2F0aXZlIGZvbGQgY2hhbmdlIGluIGdyb3d0aCAobj0gMTIsIFA9MWUtMDYsIDk1JSBDSSAtMC43NCB0byAtMC40NikuCiAgICA+IFRoaXMgaW5kaWNhdGVzIHRoYXQgZXhjaXNlZCBzdGFibGUgbGluZWFyIGludHJvbnMgY2FuIHByb3ZlIGJlbmVmaWNpYWwgaW4gc29tZSBwaHlzaW9sb2dpY2FsIGNvbnRleHRzIGFuZCBkZXRyaW1lbnRhbCBpbiBvdGhlcnMuCgozLiAgRHJhdyBhIGRpYWdyYW0gb2YgdGhlIGV4cGVyaW1lbnQuCgotICAgTGFiZWwgdGhlIGRpYWdyYW0gdXNpbmcgdGhlIHRlcm1zIHdlIGRpc2N1c3NlZCBpbiB0aGUgZmlyc3QgY2xhc3MgKFRyZWF0bWVudCwgRXhwZXJpbWVudGFsIFVuaXQsIEJsb2NrcywgUmVzcG9uc2UpCgotICAgVHJ5IHRvIHNob3cgdGhlIG92ZXJhbGwgc3RydWN0dXJlIG9mIGhvdyB0aGUgZXhwZXJpbWVudCB3YXMgbGFpZCBvdXQuCgpUaGUgZ29hbCBvZiB0aGlzIGlzIHRvIGdldCB5b3UgdGhpbmtpbmcgYWJvdXQgdGhlIGlzc3VlcyBpbiBleHBlcmltZW50YWwgZGVzaWduLCBhbmQgdG8gaGVscCBtZSB1bmRlcnN0YW5kIHRoZSByYW5nZSBvZiBxdWVzdGlvbnMgc3R1ZGVudHMgYXJlIHN0dWR5aW5nLgoKVG8gdXBsb2FkIHlvdXIgZGlhZ3JhbSwgc2F2ZSBpdCBhcyBhIGZpbGUgKGpwZWcsIHBuZywgZXRjLCBidXQgbm90IHBkZikgaW4gdGhlIGRpcmVjdG9yeSBvZiB0aGlzIC5SbWQgZmlsZS4KVGhlbiB1c2UgdGhlIEZJR1VSRS9JTUFHRSBidXR0b24gaW4gdGhlIHRvb2xiYXIgdG8gaW5zZXJ0IHlvdXIgaW1hZ2UuCgpIZXJlJ3MgYW4gZXhhbXBsZToKCiFbXShleHBlcmltZW50ZGlhZ3JhbS5ibXApCgoqKk5vdGU6KiogWW91IGNhbiB1c2UgUG93ZXJQb2ludCBvciBhIGRyYXdpbmcgdG9vbCB0byBjcmVhdGUgdGhlIGRpYWdyYW0gb24geW91ciBjb21wdXRlciwgb3IgeW91IGNhbiBkcmF3IG9uIHBhcGVyLCB0YWtlIGEgcGljdHVyZSB3aXRoIHlvdXIgcGhvbmUsIGFuZCB0aGVuIGRvd25sb2FkIHRoYXQgZmlsZSBpbnRvIHRoZSBmb2xkZXIgd2l0aCB0aGlzIEhXMS5SbWQgZmlsZSwgYW5kIGNoYW5nZSB0aGUgZmlsZSBuYW1lIGFib3ZlIHRvIHRoZSBmaWxlIG5hbWUgb2YgeW91ciBwaWN0dXJlLgpVc2luZyB0aGUgKipWaXN1YWwqKiBmb3JtYXQgKGNsaWNrIHRoZSBgVmlzdWFsYCBidXR0b24gb24gdGhlIHRvcC1sZWZ0IG9mIHRoaXMgd2luZG93KSwgY2xpY2sgb24gdGhlIGltYWdlIGljb24gdG8gaW1wb3J0IGFuZCBpbWFnZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBQYXJ0IDIgLSBSIHByYWN0aWNlCgpJbiBsYWIsIHdlIHJhbiBzaW11bGF0aW9ucyBvZiBhbiBleHBlcmltZW50IHRvIG1lYXN1cmUgdGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIGZpc2ggaW4gYSBwb25kLgoKSGVyZSwgeW91IHdpbGwgZG8gYSBzaW1pbGFyIGV4ZXJjaXNlIGV4Y2VwdCB0aGlzIHRpbWUgd2Ugd2lsbCBhbHNvIHNpbXVsYXRlIGFuICoqZXhwZXJpbWVudGFsIG1hbmlwdWxhdGlvbioqLCAoaS5lLiBhIHRyZWF0bWVudCkgYW5kIHlvdSB3aWxsIHN0dWR5IHRoZSB0cmVhdG1lbnQncyAqKmVmZmVjdCoqLgoKV2UnbGwgdXNlIHRoZSBleGFtcGxlIG9mIG1lYXN1cmluZyBwdWxzZXMgb2YgcGVvcGxlIGluIGNsYXNzIHdpdGggYSB0cmVhdG1lbnQgb2Ygc2l0dGluZyB2cyBzdGFuZGluZy4KQnV0IHRoaXMgdGltZSB3ZSdsbCAibWVhc3VyZSIgZWFjaCBwZXJzb24ncyBwdWxzZSBib3RoIHNpdHRpbmcgYW5kIHN0YW5kaW5nLgoKRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIHNpbXVsYXRpb24sIEknbGwgc3RhdGUgdGhhdCB0aGUgVFJVRSB2YWx1ZXMgZm9yIHRoZSByZWxldmFudCBwb3B1bGF0aW9uIHBhcmFtZXRlcnMgYXJlIHRoZSBmb2xsb3dpbmc6CgotICAgVGhlIGF2ZXJhZ2UgcHVsc2Ugb2Ygc29tZW9uZSBzaXR0aW5nIGlzIDcwYnBtCgotICAgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwdWxzZXMgYW1vbmcgc2l0dGluZyBwZW9wbGUgaXMgMTBicG0KCi0gICBUaGUgYXZlcmFnZSAqKmVmZmVjdCoqIG9mIHN0YW5kaW5nIGlzIDEwYnBtCgotICAgVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBzdGFuZGluZyBlZmZlY3RzIGlzIDNicG0KCiMjIFNpbXVsYXRlIDEgcGVyc29uCgpIZXJlIGlzIHRoZSBvdXRsaW5lIG9mIGNvZGUgdG8gc2ltdWxhdGUgdGhlIG1lYXN1cmVtZW50cyBmb3Igb25lIHBlcnNvbi4KRmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGJ5IHJlcGxhY2luZyB0aGUgYF9fX2Agd2l0aCBudW1iZXJzLgoKYGBge3J9CmF2ZV9zaXR0aW5nID0gNzAKc2Rfc2l0dGluZyA9IDEwCmF2ZV9zdGFuZGluZ19lZmZlY3QgPSAxMApzZF9zdGFuZGluZ19lZmZlY3QgPSAzCgpzaXR0aW5nX3B1bHNlID0gcm5vcm0obj0xLG1lYW4gPSBhdmVfc2l0dGluZywgc2QgPSBzZF9zaXR0aW5nKQpzaXR0aW5nX3B1bHNlCgpzdGFuZGluZ19lZmZlY3QgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zdGFuZGluZ19lZmZlY3QsIHNkID0gc2Rfc3RhbmRpbmdfZWZmZWN0KQpzdGFuZGluZ19wdWxzZSA9IHNpdHRpbmdfcHVsc2UgKyBzdGFuZGluZ19lZmZlY3QKc3RhbmRpbmdfcHVsc2UKc3RhbmRpbmdfZWZmZWN0CmBgYAoKPiBFbnRlciB0aGUgc2l0dGluZyBwdWxzZSwgc3RhbmRpbmcgcHVsc2UsIGFuZCBzdGFuZGluZyBlZmZlY3QuCj4gSW5jbHVkZSB1bml0cy5dCgpTaXR0aW5nIFB1bHNlOiA2OC43ODQ1NyBicG0KClN0YW5kaW5nIFB1bHNlOiA3Ny44Mjg2OCBicG0KClN0YW5kaW5nIEVmZmVjdDogOS4wNDQxMDcgYnBtCgpBcyBhbiBleHBlcmltZW50ZXIsIGl0IGlzIGltcG9zc2libGUgdG8gKipkaXJlY3RseSBvYnNlcnZlKiogdGhlICplZmZlY3Qgb2Ygc3RhbmRpbmcqIGZvciB0aGlzIHBlcnNvbi4KQWxsIHlvdSBjb3VsZCBvYnNlcnZlIGlzIGBzaXR0aW5nX3B1bHNlYCBhbmQgYHN0YW5kaW5nX3B1bHNlYC4KU2hvdyB0aGF0IHlvdSBjYW4gY2FsY3VsYXRlIHRoZSBzdGFuZGluZyBlZmZlY3QgZm9yIHRoaXMgcGVyc29uIGZyb20gdGhlc2UgdHdvIHZhbHVlcyAocmVwbGFjZSBgX19fYCB3aXRoIFIgY29kZSk6CgpgYGB7cn0KY2FsY3VsYXRlZF9zdGFuZGluZ19lZmZlY3QgPSBzdGFuZGluZ19wdWxzZSAtIHNpdHRpbmdfcHVsc2UKY2FsY3VsYXRlZF9zdGFuZGluZ19lZmZlY3QKYGBgCgo+IERvIHlvdSBnZXQgdGhlIHNhbWUgdmFsdWUgYXMgYWJvdmU/CgpZZXMuCkJ1dCB0aGF0J3MganVzdCBvbmUgcGVyc29uLCBzbyBJIHdvdWxkIGltYWdpbmUgSSB3b3VsZC4KCiMjIFNpbXVsYXRlIGFuIGV4cGVyaW1lbnQgaW52b2x2aW5nIDQwIHBlb3BsZQoKSGVyZSBpcyB0aGUgb3V0bGluZSBvZiBjb2RlIHRvIHNpbXVsYXRlIHRoZSBtZWFzdXJlbWVudHMgb2Ygc3RhbmRpbmcgZWZmZWN0cyBmb3IgNDAgcGVvcGxlLgpJdCB1c2VzIGEgKipmb3IgbG9vcCoqIGxpa2UgaW4gbGFiLgpGaWxsIGluIHRoZSBjYWxjdWxhdGlvbiBuZWVkZWQgKHJlcGxhY2UgYF9fX2Agd2l0aCBjb2RlKSBhbmQgcnVuIHRoZSBjb2RlLgoqKkVzdGltYXRlIHRoZSBhdmVyYWdlIHN0YW5kaW5nIGVmZmVjdC4qKgoKYGBge3J9CiMgbGVhdmUgdGhpcyBjb2RlIGhlcmUgc28gdGhlIHNpbXVsYXRpb24gaXMgcmVwZWF0YWJsZQpzZXQuc2VlZCgxKQoKIyBzdGFydCBvZiB5b3VyIGNvZGU6Cm5fcGVvcGxlID0gNDAKb2JzZXJ2ZWRfc3RhbmRpbmdfZWZmZWN0cyA9IHJlcChOQSx0aW1lcyA9IG5fcGVvcGxlKQoKZm9yKHBlcnNvbiBpbiAxOm5fcGVvcGxlKSB7CiAgc2l0dGluZ19wdWxzZSA9IHJub3JtKG49MSxtZWFuID0gYXZlX3NpdHRpbmcsIHNkID0gc2Rfc2l0dGluZykKICBzdGFuZGluZ19lZmZlY3QgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zdGFuZGluZ19lZmZlY3QsIHNkID0gc2Rfc3RhbmRpbmdfZWZmZWN0KQogIHN0YW5kaW5nX3B1bHNlID0gc2l0dGluZ19wdWxzZSArIHN0YW5kaW5nX2VmZmVjdAogIAogIGNhbGN1bGF0ZWRfc3RhbmRpbmdfZWZmZWN0ID0gc3RhbmRpbmdfcHVsc2UgLSBzaXR0aW5nX3B1bHNlICNPa2F5LCBidXQgSSBmZWVsIGxpa2UgSSdtIGRvaW5nIHRoaXMgd3JvbmcuIElzbid0IHRoaXMganVzdCBzdGFuZGluZ19lZmZlY3Q/IEF0IGxlYXN0IG9uIGFuIGluZGl2aWR1YWwgbGV2ZWwuCiAgb2JzZXJ2ZWRfc3RhbmRpbmdfZWZmZWN0c1twZXJzb25dID0gY2FsY3VsYXRlZF9zdGFuZGluZ19lZmZlY3QKfQoKYXZlcmFnZV9lZmZlY3RfZXN0aW1hdGUgPSBtZWFuKG9ic2VydmVkX3N0YW5kaW5nX2VmZmVjdHMpCmF2ZXJhZ2VfZWZmZWN0X2VzdGltYXRlCmBgYAoKPiBFbnRlciB5b3VyIGFuc3dlciBoZXJlLgo+IEluY2x1ZGUgdW5pdHMKCkF2ZXJhZ2UgZWZmZWN0IGVzdGltYXRlIGlzIDEwLjA3OTE2IEJQTQoKIyMgV2hhdCBpcyB0aGUgVFJVRSBlcnJvciBpbiB0aGlzIGVzdGltYXRlPwoKVXNlIHRoZSB2ZWN0b3IgYG9ic2VydmVkX3N0YW5kaW5nX2VmZmVjdHNgIGFib3ZlLCB0byBjYWxjdWxhdGUgaG93IG11Y2ggeW91ciBlc3RpbWF0ZSBtaXNzZWQgdGhlIHRydWUgdmFsdWUuCgpgYGB7cn0KdHJ1ZV9lcnJvciA9IG1lYW4ob2JzZXJ2ZWRfc3RhbmRpbmdfZWZmZWN0cykgLSBhdmVfc3RhbmRpbmdfZWZmZWN0CnRydWVfZXJyb3IKYGBgCgo+IEVudGVyIHlvdXIgYW5zd2VycyBoZXJlLgo+IEluY2x1ZGUgdW5pdHMuCgpUcnVlIGVycm9yIGlzIDAuMDc5MTU3NjQgYnBtCgojIyBDYWxjdWxhdGUgdGhlIFRSVUUgc3RhbmRhcmQgZXJyb3IgYmFzZWQgb24gdGhpcyBleHBlcmltZW50YWwgZGVzaWduIGFuZCB0aGUgVFJVRSBwb3B1bGF0aW9uIHBhcmFtZXRlcnMgYWJvdmUKCmBgYHtyfQojIEVudGVyIHlvdXIgY29kZSBoZXJlCnRydWVfc2UgPSBzcXJ0KChzZF9zdGFuZGluZ19lZmZlY3QqKjIgKyB2YXIob2JzZXJ2ZWRfc3RhbmRpbmdfZWZmZWN0cykpIC8gbl9wZW9wbGUpCnRydWVfc2UKYGBgCgo+IEVudGVyIHlvdXIgYW5zd2VycyBoZXJlLgo+IEluY2x1ZGUgdW5pdHMuCgpUcnVlIHN0YW5kYXJkIGVycm9yID0gMC42NTk2ODY0IGJwbQoKIyMgU2ltdWxhdGlvbiAxMDAgcmVwbGljYXRlIGV4cGVyaW1lbnRzIHdpdGggdGhlIHNhbWUgc2l6ZSBhbmQgcGFyYW1ldGVycyBhYm92ZSwgYW5kIHJlY29yZCB0aGUgZXN0aW1hdGVkIHN0YW5kaW5nIGVmZmVjdCBmcm9tIGVhY2ggZXhwZXJpbWVudAoKVGhlIGZvbGxvd2luZyBjb2RlIHRha2VzIHRoZSBzaW5nbGUgZXhwZXJpbWVudCB3aXRoIDQwIHBlb3BsZSBhYm92ZSwgYW5kIHVzZXMgYSAqKnNlY29uZCBmb3IgbG9vcCoqIHRvIHJlcGVhdCBpdCAxMDAgdGltZXMuCkZpbGwgaW4gdGhlIGNvZGUgZnJvbSB5b3VyIGFuc3dlcnMgYWJvdmUgdG8gY29tcGxldGUgc28gdGhhdCBpdCBlc3RpbWF0ZXMgdGhlIHRyZWF0bWVudCBlZmZlY3QgZm9yIGVhY2ggcGVyc29uLCBhbmQgdGhlbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9ic2VydmVkIHRyZWF0bWVudCBlZmZlY3QuCgpDYWxjdWxhdGUgdGhlICoqbWVhbioqIGFuZCAqKnN0YW5kYXJkIGRldmlhdGlvbioqIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0IGVzdGltYXRlcyBhY3Jvc3MgdGhlIDEwMCBleHBlcmltZW50cy4KQ29tcGFyZSB0aGVzZSB2YWx1ZXMgdG8gdGhlIHZhbHVlcyB0aGF0IHlvdSBleHBlY3QuCgpgYGB7cn0Kc2V0LnNlZWQoMSkKCm5fZXhwZXJpbWVudHMgPSAxMDAKcmVwbGljYXRlX2VzdGltYXRlcyA9IHJlcChOQSx0aW1lcyA9IG5fZXhwZXJpbWVudHMpCgpmb3IoZXhwdCBpbiAxOjEwMCkgewogICMgY29kZSBmb3IgZWFjaCBpbmRpdmlkdWFsIGV4cGVyaW1lbnQ6CiAgbl9wZW9wbGUgPSA0MAogIG9ic2VydmVkX3N0YW5kaW5nX2VmZmVjdHMgPSByZXAoTkEsdGltZXMgPSBuX3Blb3BsZSkKICAKICBmb3IocGVyc29uIGluIDE6bl9wZW9wbGUpIHsKICAgIHNpdHRpbmdfcHVsc2UgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zaXR0aW5nLCBzZCA9IHNkX3NpdHRpbmcpCiAgICBzdGFuZGluZ19lZmZlY3QgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zdGFuZGluZ19lZmZlY3QsIHNkID0gc2Rfc3RhbmRpbmdfZWZmZWN0KQogICAgc3RhbmRpbmdfcHVsc2UgPSBzaXR0aW5nX3B1bHNlICsgc3RhbmRpbmdfZWZmZWN0CiAgICAKICAgIGNhbGN1bGF0ZWRfc3RhbmRpbmdfZWZmZWN0ID0gc3RhbmRpbmdfcHVsc2UgLSBzaXR0aW5nX3B1bHNlCiAgICBvYnNlcnZlZF9zdGFuZGluZ19lZmZlY3RzW3BlcnNvbl0gPSBjYWxjdWxhdGVkX3N0YW5kaW5nX2VmZmVjdAogIH0KICAKICAjIGNhbGN1bGF0ZSB0aGUgZXN0aW1hdGVkIG1lYW4gdHJlYXRtZW50IGVmZmVjdCBmb3IgdGhpcyBleHBlcmltZW50CiAgY3VycmVudF9leHBlcmltZW50X2VzdGltYXRlID0gbWVhbihvYnNlcnZlZF9zdGFuZGluZ19lZmZlY3RzKQogIAogICMgc2F2ZSB0aGF0IGVzdGltYXRlIGluIHRoZSB2ZWN0b3Igb2YgcmVzdWx0cwogIHJlcGxpY2F0ZV9lc3RpbWF0ZXNbZXhwdF0gPSBjdXJyZW50X2V4cGVyaW1lbnRfZXN0aW1hdGUKfQoKbWVhbihyZXBsaWNhdGVfZXN0aW1hdGVzKQpzZChyZXBsaWNhdGVfZXN0aW1hdGVzKQpgYGAKCj4gRW50ZXIgeW91ciBhbnN3ZXJzIGhlcmUuCj4gSW5jbHVkZSB1bml0cy4KCk1lYW4gdHJlYXRtZW50IGVmZmVjdCBpcyAxMC4wMzk2NCBicG0gU3RhbmRhcmQgZGV2aWF0aW9uIGlzIDAuNDUxMjQ1IGJwbQoKIyMgQ29tcGFyZSB0byBhbiBleHBlcmltZW50IHRoYXQgbWVhc3VyZWQgRElGRkVSRU5UIFBFT1BMRSBmb3IgdGhlIHR3byB0cmVhdG1lbnRzCgpUaGUgZm9sbG93aW5nIGNvZGUgbW9kaWZpZXMgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gdG8gYmUgbW9yZSBzaW1pbGFyIHRvIHdoYXQgd2UgZGlkIGluIGNsYXNzLgpXZSBzZWxlY3QgNDAgcGVvcGxlIHRvIG9ic2VydmUgc2l0dGluZywgYW5kIDQwIERJRkZFUkVOVCBwZW9wbGUgdG8gb2JzZXJ2ZSBzdGFuZGluZy4KV2UgY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHB1bHNlcyBvZiB0aGUgcGVvcGxlIHNpdHRpbmcsIGFuZCB0aGUgYXZlcmFnZSBwdWxzZXMgb2YgdGhlIHBlb3BsZSBzdGFuZGluZy4KV2UgdGhlbiB0YWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgdHdvIGFzIG91ciBlc3RpbWF0ZSBvZiB0aGUgc3RhbmRpbmcgZWZmZWN0LgpUaGlzICoqZnVsbCBleHBlcmltZW50KiogaXMgcmVwbGljYXRlZCAxMDAgdGltZXMgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSBpdCdzIGVmZmljaWVuY3kgdG8gdGhlIHByZXZpb3VzIGV4cGVyaW1lbnQuCgpSZXBvcnQgdGhlICoqbWVhbioqIGFuZCAqKnN0YW5kYXJkIGRldmlhdGlvbioqIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0IGVzdGltYXRlcyBhY3Jvc3MgdGhlIDEwMCBleHBlcmltZW50cy4KQ29tcGFyZSB0aGVzZSB2YWx1ZXMgdG8gdGhlIHByZXZpb3VzIGV4cGVyaW1lbnRhbCBkZXNpZ24gYWJvdmUKCmBgYHtyfQpzZXQuc2VlZCgxKQoKbl9leHBlcmltZW50cyA9IDEwMApyZXBsaWNhdGVfZXN0aW1hdGVzID0gcmVwKE5BLHRpbWVzID0gbl9leHBlcmltZW50cykKCmZvcihleHB0IGluIDE6MTAwKSB7CiAgIyBjb2RlIGZvciBlYWNoIGluZGl2aWR1YWwgZXhwZXJpbWVudDoKICAKICAjIGZpcnN0IG9ic2VydmUgNDAgcGVvcGxlIHNpdHRpbmcKICBuX3Blb3BsZSA9IDQwCiAgb2JzZXJ2ZWRfc2l0dGluZ19wdWxzZXMgPSByZXAoTkEsdGltZXMgPSBuX3Blb3BsZSkKICAKICBmb3IocGVyc29uIGluIDE6bl9wZW9wbGUpIHsKICAgIHNpdHRpbmdfcHVsc2UgPSBybm9ybShuPTEsbWVhbiA9IGF2ZV9zaXR0aW5nLCBzZCA9IHNkX3NpdHRpbmcpCiAgICBvYnNlcnZlZF9zaXR0aW5nX3B1bHNlc1twZXJzb25dID0gc2l0dGluZ19wdWxzZQogIH0KICAKICAjIFRoZW4gb2JzZXJ2ZSA0MCBwZW9wbGUgc3RhbmRpbmcKICBuX3Blb3BsZSA9IDQwCiAgb2JzZXJ2ZWRfc3RhbmRpbmdfcHVsc2VzID0gcmVwKE5BLHRpbWVzID0gbl9wZW9wbGUpCiAgCiAgZm9yKHBlcnNvbiBpbiAxOm5fcGVvcGxlKSB7CiAgICBzaXR0aW5nX3B1bHNlID0gcm5vcm0obj0xLG1lYW4gPSBhdmVfc2l0dGluZywgc2QgPSBzZF9zaXR0aW5nKQogICAgc3RhbmRpbmdfZWZmZWN0ID0gcm5vcm0obj0xLG1lYW4gPSBhdmVfc3RhbmRpbmdfZWZmZWN0LCBzZCA9IHNkX3N0YW5kaW5nX2VmZmVjdCkKICAgIHN0YW5kaW5nX3B1bHNlID0gc2l0dGluZ19wdWxzZSArIHN0YW5kaW5nX2VmZmVjdAogICAgb2JzZXJ2ZWRfc3RhbmRpbmdfcHVsc2VzW3BlcnNvbl0gPSBzdGFuZGluZ19wdWxzZQogIH0KICAKICAjIFRoZW4gY2FsY3VsYXRlIHRoZSB0d28gYXZlcmFnZXMKICBhdmVyYWdlX3NpdHRpbmdfcHVsc2UgPSBtZWFuKG9ic2VydmVkX3NpdHRpbmdfcHVsc2VzKQogIGF2ZXJhZ2Vfc3RhbmRpbmdfcHVsc2UgPSBtZWFuKG9ic2VydmVkX3N0YW5kaW5nX3B1bHNlcykKICAKICAjIFRoZW4gZ2V0IG91ciBlc3RpbWF0ZSBvZiB0aGUgc3RhbmRpbmcgZWZmZWN0CiAgY3VycmVudF9leHBlcmltZW50X2VzdGltYXRlID0gYXZlcmFnZV9zdGFuZGluZ19wdWxzZSAtIGF2ZXJhZ2Vfc2l0dGluZ19wdWxzZQogIAogICMgc2F2ZSB0aGF0IGVzdGltYXRlIGluIHRoZSB2ZWN0b3Igb2YgcmVzdWx0cwogIHJlcGxpY2F0ZV9lc3RpbWF0ZXNbZXhwdF0gPSBjdXJyZW50X2V4cGVyaW1lbnRfZXN0aW1hdGUKfQoKbWVhbihyZXBsaWNhdGVfZXN0aW1hdGVzKQpzZChyZXBsaWNhdGVfZXN0aW1hdGVzKQpgYGAKCj4gRW50ZXIgeW91ciBhbnN3ZXJzIGhlcmUuCj4gSW5jbHVkZSB1bml0cy4KCk1lYW4gdHJlYXRtZW50IGVmZmVjdCBpcyAxMC4yMDk5NiBicG0gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIFRyZWF0bWVudCBFZmZlY3QgaXMgMi4xMTU0MDEgYnBtCgojIyBEaXNjdXNzIGV4cGVyaW1lbnRhbCBkZXNpZ24gaXNzdWVzIHRoYXQgbWlnaHQgaW1wYWN0IHRoZSBWQUxJRElUWSBvZiB0aGUgdHdvIGRlc2lnbnMKCkZvY3VzIG9uIGlzc3VlcyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgc2NpZW50aWZpYyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmVzdWx0cy4KCj4gVGhlIGZpcnN0IG9uZSB0aGF0IGNvbWVzIHRvIG1pbmQgaXMgaW4gdGhlIGhldGVyb2dlbmVpdHkgaW4gdGhlIHBvcHVsYXRpb24sIGVzcGVjaWFsbHkgaW4gdGhlIHNlY29uZCBjYXNlLgo+IE1lYXN1cmluZyB0aGUgc3RhbmRpbmcgYW5kIHNpdHRpbmcgcHVsc2VzIG9mIHR3byBkaXN0aW5jdCBwb3B1bGF0aW9ucyBsZWF2ZXMgcm9vbSBmb3IgYmlvbG9naWNhbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gb2YgdGhlIGdyb3VwcyB0byBpbmZsdWVuY2UgdGhlIHJlc3VsdHMuCj4gRnVydGhlcm1vcmUsIHRoZXJlIHdlcmUgbm8gY29udHJvbHMgZGVzY3JpYmVkIGluIHRoZSBleHBlcmltZW50LCB3aGljaCBmb3IgdGhlIGZpcnN0IHdvdWxkIGJlIGEgcmVwbGljYXRpb24gd2hlcmUgdGhlIHRyZWF0bWVudCBncm91cCBkaWRuJ3Qgc3RhbmQuCj4gVGhpcyBhbGwgY29tZXMgdG9nZXRoZXIgdG8gbWFrZSBpdCBkaWZmaWN1bHQgdG8gZGVmaW5pdGl2ZWx5IHF1YW50aWZ5IHRoZSBlZmZlY3Qgb2Ygc3RhbmRpbmcgb24gYSBwZXJzb24ncyBwdWxzZSB3aXRoIGFueSBzZW5zZSBvZiBzY29wZSwgc2luY2UgdGhlcmUgZXhpc3RzIG5vIGVzdGFibGlzaGVkIGJhc2VsaW5lIGFuZCB0aGUgc2Vjb25kIGV4cGVyaW1lbnQgaXMgb3BlbiB0byBhIGdyZWF0IGRlYWwgb2YgZXJyb3IgaW4gcG9wdWxhdGlvbiBkaWZmZXJlbmNlcy4K